/**
 *  
 * @param { any }  obj   // 新的this指向
 * @param { ...any  }  arr     // 形参列表
 * @returns  { Function }  //返回一个新的函数
 * 
 * 功能： 模拟实现 bind 方法
 * name: 袁天樂
 * time: 2021/09/16
 */
Function.prototype.newBind = function (obj, ...arr) {
    if (!obj) obj = window
    let key = Symbol("key")
    obj[key] = this
    return (...brr) => { //接收第二次的传入的形参列表 
        let str = obj[key](...arr, ...brr)
        delete obj[key]
        return str
    }
}

/**
 * 
 * @param {number} a 
 * @param {number} b 
 * @param {number} c 
 * @returns  {number}  
 */

// 测试
function names(a, b, c) {
    return a + b + c + this.a
}
let obj = {
    a: 123
}

console.log(names.newBind(obj, 1, 2)(1));  //  127
console.log(obj); //  { a: 123 }